package positionFeqW;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.TreeMap;
public class PositionFeqWReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    // 使用 TreeMap 按职位出现次数从高到低排序
    //初始化了一个 TreeMap，它是 Java 集合框架中的一种有序的映射数据结构。
    // 这里通过自定义的比较器 (o1, o2) -> o2 - o1 实现了按照键（即职位出现的次数，是整数类型）
    // 从高到低排序的功能，用于存储每个职位名称及其对应的出现总次数，方便后续找出高频词。
    private TreeMap<Integer, String> positionFreqMap = new TreeMap<>((o1, o2) -> o2 - o1);
    private int topN = 7;

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable value : values) {
            sum += value.get();
        }
        positionFreqMap.put(sum, key.toString());
        if (positionFreqMap.size() > topN) {
            positionFreqMap.pollLastEntry();

        }
    }

    @Override//cleanup方法会在整个 Reduce 任务结束后执行一次，用于输出最终的结果。
    protected void cleanup(Context context) throws IOException, InterruptedException {
        for (Integer freq : positionFreqMap.keySet()) {
            context.write(new Text(positionFreqMap.get(freq)), new IntWritable(freq));
        }

    }
}
